#include "comm.h"

//共享内存

key_t getftok()
{
    key_t key = ftok(pathname, proj_id);
    if (key < 0)
    {
        cerr << "getftok errno:" << errno << "strerror:" << strerror(errno) << endl;
    }
    return key;
}

int create_shm(key_t key)
{
    int shm_id = shmget(key, Size, IPC_CREAT | 0664);
    if (key < 0)
    {
        cerr << "create shm errno:" << errno << "strerror:" << strerror(errno) << endl;
        exit(1);
    }
    return shm_id;
}

int main()
{
   
    int fd = open(FILENAME,O_WRONLY);  //以只写方式打开
   
    key_t key = getftok();

    int shm_id = create_shm(key);

    char *s = (char *)shmat(shm_id, nullptr, 0);

    char ch = 'a', c;

    
    for (int i = 0; i < 26; i++)
    {
        char ret[Size]={0};
        read(0,ret,sizeof ret);
        ret[strlen(ret)-1 ] ='\0';
        strncpy(s,ret,sizeof ret);
       
        int a;
        int n = write(fd, &a, sizeof a);  //示意 server 可以读取
        if (n < 0)
        {
            cerr << "errno:" << errno << "strerror:" << strerror(errno) << endl;
            exit(1);
        }
        if(n==0)
        {
            break;
        }
        
        //sleep(1);
    }
    /* for (int i = 0; i < 26; i++)
    {
        c = 'a' + i;
        s[i] = c;
        cout << "client write :" << c << "done" << endl;

        int a;
        int n = write(fd, &a, sizeof a);
        if (n < 0)
        {
            cerr << "errno:" << errno << "strerror:" << strerror(errno) << endl;
            exit(1);
        }
        if(n==0)
        {
            break;
        }
        
        sleep(1);
    } */

    cout << "5s later close client !" << endl;
    sleep(5);

    int n = shmdt((void *)s);
    if (n < 0)
    {
        cerr << "errno:" << errno << "strerror:" << strerror(errno) << endl;
    }

    int num = shmctl(shm_id, IPC_RMID, nullptr);
    if (num < 0)
    {
        cerr << "errno:" << errno << "strerror:" << strerror(errno) << endl;
    }

    cout << "Already close client! " << endl;
}